// 导入axios
import axios from "axios";
// 使用element-plus Message做消息提醒
import message from "@/common/element-plus/message";
// 导入封装的loadon.js
import loadon from "@/common/element-plus/loadon";
// 导入请求头类型
import contentType from "@/common/config/content-type";
// 重定向
import router from "@/router/index";

/** 创建新的axios实例 */
const service = axios.create({
  // 公共接口 localStorage.getItem("interfaceAddress") ||
  baseURL: import.meta.env.VITE_API,
  // 超时时间
  timeout: import.meta.env.VITE_AXIOS_TIMEOUT,
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    if (!config.data) config.data = {};
    setToken(config);
    contentTypeConfig(config);
    // console.log(config);
    if (config.loadon) {
      loadon.show();
    }
    return config;
  },
  (error) => {
    loadon.hide();
    Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 接收到响应数据并成功后的一些共有的处理，关闭loading等
    loadon.hide();
    if (response.headers["content-type"].startsWith("image")) {
      const blob = new Blob([response.data], {
        type: response.headers["content-type"],
      });
      const res = URL.createObjectURL(blob);
      return Promise.resolve(res);
    }
    if (response.data.success) return Promise.resolve(response.data);
    if (response.data.code === 11001 || response.data.code === 11006) {
      localStorage.clear();
      router.push("/login");
    }
    if (response.data.code === 12001 || response.data.code === 11004 || response.data.code === 11005) {
      return Promise.resolve(response.data);
    }
    if (response.data instanceof Blob) {
      const fileReader = new FileReader();
      fileReader.readAsText(
        new Blob([response.data], { type: "application/octet-stream" }),
        "utf-8"
      );
      fileReader.onload = () => {
        const result = JSON.parse(fileReader.result);
        // 错误提示信息，根据接口返回内容不同
        message.error(result.message);
      };
    } else {
      message.error(response.data.message);
    }
    return Promise.reject(response.data);
  },
  (error) => {
    loadon.hide();
    // 接收到异常响应的处理开始
    if (error && error.response) {
      // 根据响应码具体处理
      switch (error.response.status) {
        case 400:
          error.message = "错误请求";
          break;
        case 401:
          error.message = "未授权，请重新登录";
          break;
        case 403:
          error.message = "拒绝访问";
          break;
        case 404:
          error.message = "请求错误,未找到该资源";
          router.push("/notFound");
          break;
        case 405:
          error.message = "请求方法未允许";
          break;
        case 408:
          error.message = "请求超时";
          break;
        case 500:
          error.message = "服务器端出错";
          break;
        case 501:
          error.message = "网络未实现";
          break;
        case 502:
          error.message = "网络错误";
          break;
        case 503:
          error.message = "服务不可用";
          break;
        case 504:
          error.message = "网络超时";
          break;
        case 505:
          error.message = "http版本不支持该请求";
          break;
        default:
          error.message = `连接错误${error.response.status}`;
      }
    } else {
      error.message = "连接服务器失败";
      // 超时处理
      if (JSON.stringify(error).includes("timeout")) {
        error.message = "服务器响应超时，请刷新当前页";
      }
    }
    // message.error(error.message);
    message.error(error.response.data.message);
    // return Promise.reject(error.message);
    return Promise.reject(error.response.data.message);
  }
);

/**
 * 请求内容类型配置
 */
const contentTypeConfig = (config) => {
  const type = config.type === void 0 ? contentType.Json : config.type;
  config.headers.set("Content-Type", type);
};

/**
 * 请求头带token
 */
const setToken = (config) => {
  if (
    localStorage.getItem("tokenName") &&
    localStorage.getItem(localStorage.getItem("tokenName"))
  ) {
    config.headers.set(
      localStorage.getItem("tokenName"),
      localStorage.getItem(localStorage.getItem("tokenName"))
    );
  }
};

export default service;
